/*
Copyright (C) 2009  Raymond Jeon
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/


#include "gl_lib_include.h"
#include "gl_mail_log.h"
#include "gl_mail_define.h"
#include "gl_mail_gdata.h"
#include "gl_smmp_session.h"
#include "gl_smmp_command.h"






////////////////////////////////////////////////////////////////////////////////
//	Date : 2003-3-25
//	Update : 
//	Author : Raymond Jeon
//	Parameters
//	Return Value  
//	Remarks 
////////////////////////////////////////////////////////////////////////////////

BOOL GlSmmpThreadMain(glqueue_ *qData)
{
	glsmmpsession_	smmp_;
	glsmmpsession_	*gsn = &(smmp_);
	SOCKRET			sockRet;


	GlLogSmmp(1, "SMMP Session Start (%s)", qData->q_szIp);	

	if (GlSmmpSessionInit(gsn, qData) == FALSE)
	{
		GlSmmpSessionFree(gsn);
		return FALSE;
	}

	if (GlLinkListFindWildCardTild(glData.listenSmmp.llRejectIP, qData->q_szIp) &&
		!GlLinkListFindWildCardTild(glData.listenSmmp.llAllowIP, qData->q_szIp))
	{
		GlSocketStreamPrintfLnLog(gsn->stream, GlLogSmmp, "-ERR Reject IP (%s)", qData->q_szIp);
		GlSocketStreamPrintStrLn(gsn->stream, ".");
		GlSmmpSessionFree(gsn);
		return TRUE;
	}

	GlSocketStreamPrintfLn(gsn->stream, "+OK %s SMMP server (%s) is ready %s",
				__SZ(glData.szServerName), glData.szServerVersion, gsn->szDate);
	GlSocketStreamPrintStrLn(gsn->stream, ".");

	while (gsn->stream->bClose == FALSE)
	{
		sockRet = GlSocketStreamReadLineLog4PassHide(gsn->stream, GlLogSmmp);
		if (sockRet <= 0)
		{
			GlLogSmmp(1, "Socket error");
			break;
		}
		
		GlSmmpCommandFuncCall(gsn);
		if (gsn->stream->bClose == FALSE)
			GlSocketStreamPrintStrLn(gsn->stream, ".");
	}

	GlSmmpSessionFree(gsn);

	return TRUE;
}
